package reportes.Modulos;

import Negocios.ControlCategories;
import Negocios.ControlEmployee;
import Negocios.ControlPermissions;
import Negocios.ControlProductDetail;
import Negocios.ControlProviders;
import Negocios.ControlSales;
import Negocios.ControlStock;
import Negocios.ControlSubcategory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author lightemp
 */
public class ModuloReporte {

    Connection conexionSQL = null;
    String tipoReporte = null;//Nombre global del reporte que se va a cargar

    public ModuloReporte(String reportToCharge) {
        Conexion();
        tipoReporte = reportToCharge;
        ejecutarReporte();
    }

    private void Conexion() {
        try {
            Class.forName("com.mysql.jdbc.Driver"); //se carga el driver
            conexionSQL = DriverManager.getConnection("jdbc:mysql://localhost:3333/salestedispatcher?zeroDateTimeBehavior=convertToNull", "root", "rdx06082013elmdrg");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void cerrar() {
        try {
            conexionSQL.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public String eligeRutaReporte(String reporte) {
        switch (reporte) {
            case "Ventas":
                reporte = System.getProperty("user.dir") + "/reporteVenta.jrxml";
//                reporte = getClass().getResource("/reportes/Reporte/reporteVenta.jrxml").getPath();
                break;
            case "Productos":
                reporte = System.getProperty("user.dir") + "/reporteProductos.jrxml";
//                reporte = getClass().getResource("/reportes/Reporte/reporteProductos.jrxml").getPath();
                break;
            case "Stock":
                reporte = System.getProperty("user.dir") + "/reporteStock.jrxml";
//                reporte = getClass().getResource("/reportes/Reporte/reporteStock.jrxml").getPath();
                break;
            case "Empleados":
                reporte = System.getProperty("user.dir") + "/reporteEmpleados.jrxml";
//                reporte = getClass().getResource("/reportes/Reporte/reporteEmpleados.jrxml").getPath();
                break;
        }
        return reporte;
    }

    private boolean isRegistros(String nombreTabla) {
        List listEntity = null;
        switch (nombreTabla) {
            case "Empleados":
                ControlEmployee employee = new ControlEmployee();
                listEntity = employee.selectAll();
                break;
            case "Productos":
                ControlProductDetail product = new ControlProductDetail();
                listEntity = product.selectAll();
                break;
            case "Proveedores":
                ControlProviders providers = new ControlProviders();
                listEntity = providers.selectAll();
                break;
            case "Stock":
                ControlStock stock = new ControlStock();
                listEntity = stock.selectAll();
                break;
            case "Categorias":
                ControlCategories categoria = new ControlCategories();
                listEntity = categoria.selectAll();
                break;
            case "Subcategorias":
                ControlSubcategory cs = new ControlSubcategory();
                listEntity = cs.selectAll();
                break;
            case "Permisos":
                ControlPermissions cp = new ControlPermissions();
                listEntity = cp.selectAll();
                break;
            case "Ventas":
                ControlSales cv = new ControlSales();
                listEntity = cv.selectAll();
                break;
        }
        if (listEntity.isEmpty()) {
            return false;
        }
        return true;
    }

    private void ejecutarReporte() {
        if (isRegistros(tipoReporte)) {
            try {

                String archivo = eligeRutaReporte(tipoReporte);
                if (archivo == null) {
                    JOptionPane.showMessageDialog(null, "Error al cargar reporte",
                            "Generar Reporte", JOptionPane.ERROR_MESSAGE);
                }
                JasperReport masterReport = null;
                try {
                    masterReport = JasperCompileManager.compileReport(archivo);
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, e,
                            "Error al cargar reporte", JOptionPane.ERROR_MESSAGE);
                    System.out.println(e);
                }
                JasperPrint jasperPrint = JasperFillManager.fillReport(masterReport, new HashMap(), conexionSQL);
                JasperViewer.viewReport(jasperPrint, false);
                //JasperPrintManager.printReport(jasperPrint,true);
                cerrar();
            } catch (JRException e) {
                JOptionPane.showMessageDialog(null, "Error al compilar reporte",
                        "Generar Reporte", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "No existen registros para mostrar en reporte",
                    "Generar Reporte", JOptionPane.ERROR_MESSAGE);
        }
    }
}
